package com.xxx.filter;

import org.apache.shiro.session.Session;
import org.apache.shiro.web.filter.AccessControlFilter;
import org.apache.shiro.web.util.WebUtils;

import com.xxx.constant.SystemConstants;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * 强制退出过滤器
 */
public class ForceLogoutFilter extends AccessControlFilter {

	/**
	 * 是否允许访问
	 */
	@Override
	protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
			throws Exception {
		// 判断当前session是否为空，如果为空，说明尚未登录，允许访问
		Session session = super.getSubject(request, response).getSession(false);
		if (session == null) {
			return true; // true表示允许访问
		}
		// 判断当前session不为空，且强制退出标识为null，说明是正常访问用户，允许访问
		if(session.getAttribute(SystemConstants.SESSION_FORCE_LOGOUT_KEY) == null) {
			return true;
		}
		return false; // 其他均为不允许访问
	}

	/**
	 * 被拒绝访问时的操作
	 * 表示访问拒绝时是否自己处理，如果返回true 表示自己不处理且继续拦截器链执行，返回false表示自己已经处理了（比如重定向到另一个页面）
	 */
	@Override
	protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
		try {
			// 强制退出
			super.getSubject(request, response).logout();
		} catch (Exception e) {
			System.err.println(e);
		}

		// 重定向到login的url
		String loginUrl = super.getLoginUrl() + (getLoginUrl().contains("?") ? "&" : "?") + "forceLogout=1";
		WebUtils.issueRedirect(request, response, loginUrl);
		return false;
	}
}
